home *** CD-ROM | disk | FTP | other *** search
/ Skunkware 5 / Skunkware 5.iso / src / X11 / endo / info.c < prev    next >
C/C++ Source or Header  |  1995-05-03  |  27KB  |  767 lines

  1. /*************************************************************************
  2.  *                                                                       *
  3.  *  Copyright (c) 1992, 1993 Ronald Joe Record                           *
  4.  *                                                                       *
  5.  *  All rights reserved. No part of this program or publication may be   *
  6.  *  reproduced, transmitted, transcribed, stored in a retrieval system,  *
  7.  *  or translated into any language or computer language, in any form or *
  8.  *  by any means, electronic, mechanical, magnetic, optical, chemical,   *
  9.  *  biological, or otherwise, without the prior written permission of:   *
  10.  *                                                                       *
  11.  *      Ronald Joe Record (408) 458-3718                                 *
  12.  *      212 Owen St., Santa Cruz, California 95062 USA                   *
  13.  *                                                                       *
  14.  *************************************************************************/
  15.  
  16. #include "x.h"
  17.  
  18. short delay = 0;
  19.  
  20. static int numselect, map_width, num_width;
  21. static int ascent, descent, spacing, dir;
  22. static XCharStruct overall;
  23. static char str[256];
  24. static char *Mapdefs[NUMDEFS] = {
  25. "   x(n+1) = A*x(n)*[E - F*x(n)] + B*y(n)*[G - I*y(n)]                        ",
  26. "   y(n+1) = C*y(n)*[J - K*y(n)] + D*x(n)*[L - M*x(n)]                        ",
  27. "   x(n+1) = x(n) + B*x(n)/[1 - y(n+1)] - BC*x(n) - D*x(n)                    ",
  28. "   y(n+1) = y(n)/[A + x(n)] - D*y(n) - E*y(n)                                ",
  29. "   x(n+1) = [A*x(n) + B*y(n)] * exp(-C * [x(n) + y(n)])                      ",
  30. "   y(n+1) = D*x(n)                                                           ",
  31. "   x(n+1) = [E + J*x(n)] - A*sin(2*PI*x(n)) + [E + K*y(n)] - B*sin(2*PI*y(n))",
  32. "   y(n+1) = [F + L*y(n)] - C*sin(2*PI*y(n)) + [I + M*x(n)] - D*sin(2*PI*(n)) ",
  33. "   x(n+1) = A * sin(PI * x(n))] + [B * sin(PI * y(n))]                       ",
  34. "   y(n+1) = C * sin(PI * y(n))] + [D * sin(PI * x(n))]                       ",
  35. "   x(n+1) = [E + J*x(n)] - A*sin(2*PI*x(n)) + [F + K*y(n)] - B*cos(2*PI*y(n))",
  36. "   y(n+1) = [G + L*y(n)] - C*sin(2*PI*y(n)) + [I + M*x(n)] - D*cos(2*PI*(n)) ",
  37. "   x(n+1) = x(n) + A*sin(y(n))                                               ",
  38. "   y(n+1) = y(n) + x(n) + B*sin(y(n))                                        ",
  39. #ifdef NorthSouth
  40. "   x(n+1) = (N_B * N_GNP) + ((1 - N_A) * x(n)) (with I = GNP*(1-gamma))      ",
  41. "   y(n+1) = (B * S_GNP) + ((1 - A) * y(n))     (with I = GNP*(1-gamma))      ",
  42. #endif
  43. #ifdef Gardini
  44. "   x(n+1) = y - Bxy                                                          ",
  45. "   y(n+1) = y - Ax + Cx^3                                                    ",
  46. "   x(n+1) = Bx + y                                                           ",
  47. "   y(n+1) = A + x^2                                                          ",
  48. "   x(n+1) = By                                                               ",
  49. "   y(n+1) = y - Ax + x^2                                                     ",
  50. #endif
  51. "   y(n+1) = (y(n) - rho*sin(x(n)))/C                                         ",
  52. "   x(n+1) = x(n) - y(n+1)                                                    ",
  53. "   x(n+1) = -((x-a)*cos(pi*r/w) - y*sin(pi*r/w) + a)                         ",
  54. "   y(n+1) = -((x-a)*sin(pi*r/w) + y*cos(pi*r/w))                             ",
  55. "   x(n+1) = 4*A*y(n)*[1 - y(n)] + (1 - A)*x(n)                               ",
  56. "   y(n+1) = 4*B*x(n)*[1 - x(n)] + (1 - B)*y(n)                               ",
  57. "   x(n+1) = 4*A*x(n)*[1 - x(n)] + (1 - A)*y(n)                               ",
  58. "   y(n+1) = 4*B*y(n)*[1 - y(n)] + (1 - B)*x(n)                               ",
  59. "   x(n+1) = [1 + A*B]*x(n) - A*x(n)*y(n)                                     ",
  60. "   y(n+1) = [1 - A]*y(n) + A*x(n)*x(n)                                       ",
  61. "   x(n+1) = y(n) + F(x(n)) + B*y(n)*[1 + C*y(n)*y(n)]                        ",
  62. "   y(n+1) = -x(n) + F(x(n+1))x(n)*x(n)                                       ",
  63. " x(n+1) = x+A/2(f(x,y)+f(p(x,y),q(x,y)))  f(x,y)=Dx-Exy  g(x,y)=Gxy-Fy       ",
  64. " y(n+1) = y+A/2(g(x,y)+g(p(x,y),q(x,y)))  p(x,y)=x+Bf(x,y)  q(x,y)=y+Cg(x,y) ",
  65. " x(n+1) = x*x - y*y + A + C*x                                                ",
  66. " y(n+1) = 2*x*y + B + D*C*y                                                  ",
  67. " x(n+1) = x + A(C - B*x + x*x*y - x)                                         ",
  68. " y(n+1) = y + A(B*x - x*x*y)                                                 ",
  69. " x(n+1) = x - [f(x) * (x - y)] / [f(x) - f(y)]                               ",
  70. " y(n+1) = x   where f(x) = Lx^A + Kx^(A-1) + ... + Dx^2 + Cx + B             ",
  71. " x(n+1) = x^2 - y^2 - x - Ay                                                 ",
  72. " y(n+1) = 2xy - Bx + y                                                       ",
  73. " x(n+1) = Gx+F+Asin(2PIx)+Bsin(2PIx)cos(2PIy)+Csin(4PIx)+Dsin(6PIx)cos(4PIy)-Esin(2PIy)",
  74. " y(n+1) = gy+f+asin(2PIy)+bsin(2PIy)cos(2PIx)+csin(4PIy)+dsin(6PIy)cos(4PIx)-esin(2PIx)",
  75. " z(n+1) = (A+B*z*zbar+C*Re(z^F)+G*Re((z/|z|)^F*I)*|z|+E*i)*z+D*(zbar^(F-1))  ",
  76. " where z is a complex number, zbar its conjugate and Re denotes the real part",
  77. " x(n+1) = x*exp(A*(1-B*x) - (N * y))                                       ",
  78. " y(n+1) = x*(1-exp(-N*y)) where N=(D*A)/(1-exp(C*A))                        "
  79. #ifdef Plendo
  80. ," x+ = Ax + Cy + D + Ex^2 + Fy^2 + G                                         ",
  81. " y+ = Ix + Jy + B + Kx^2 + Ly^2 + K                                          ",
  82. " x+ = Ax + Cy                                                                ",
  83. " y+ = Dx + Ex^2 + Bxy + Fy                                                   ",
  84. " x+ = x^2 - y^2 + A + Bx                                                     ",
  85. " y+ = 2xy - 5/2(By)                                                          ",
  86. " x+ = Bx + Cy                                                                ",
  87. " y+ = Ax + Dy + Ex^3                                                         "
  88. #endif
  89. };
  90.  
  91. Show_Info()
  92. {
  93.  
  94.     extern int found_arc, mandel, maxcrit, numattrs, maxhist, minhist;
  95.     extern double sea_level, sky_level;
  96. #ifdef NorthSouth
  97.     extern double singularity, A_zero, A_one, A_two, A_star, B_zero, B_one;
  98.     extern double S_singularity, H_one, H_zero, O_B_zero, O_B_one;
  99.     extern double S_A_zero, S_A_one, S_A_two, S_A_star, S_B_zero, S_B_one;
  100.     extern double O_S_B_zero, O_S_B_one;
  101.     extern double pB, A2T, A1T, CT, ET, FT, GT;
  102.     extern pair GNP, RK;
  103.     static char *mops[HALF] = { "delta", "s    ", "a1   ", "a2   ", "c1   ",
  104.           "c2   ", "D    ", "Kbar ", "Lbar ", "alpha", "beta ", "gamma" };
  105. #endif
  106.     static int numparams[NUMMAPS]= {12,5,4,12,4,12,2,
  107. #ifdef NorthSouth
  108. #ifdef Gardini
  109.     12,3,2,2,
  110. #else
  111.     12,
  112. #endif
  113. #else
  114. #ifdef Gardini
  115.     3,2,2,
  116. #endif
  117. #endif
  118.     2,3,2,2,2,3,7,4,3,12,2,7,8,4
  119. #ifdef Plendo
  120.     , 12, 6, 2, 5
  121. #endif
  122.     };
  123.     static int i, x_str, y_str;
  124.     static GC gc;
  125.     static char ops[HALF] = { 'A','B','C','D','E','F','G','I','J','K','L','M' };
  126.  
  127.     if (displayplanes > 1)
  128.     gc = Data_GC[CG];
  129.     else
  130.     gc = Data_GC[1];
  131.     XClearWindow(dpy, info);
  132.     y_str = 20; x_str = 175;
  133.     sprintf(str,"Iterating the %s Map ",Mapnames[mapindex]);
  134.     XDrawImageString(dpy,info,gc,x_str,y_str,str,strlen(str));
  135.     XQueryTextExtents(dpy,(XID)XGContextFromGC(gc),"X",
  136.             1,&dir,&ascent,&descent,&overall);
  137.     spacing = ascent + descent + 7;
  138.     y_str += spacing; 
  139.     x_str = 40;
  140.     XDrawImageString(dpy,info,gc,x_str,y_str,Mapdefs[2*mapindex],
  141.         strlen(Mapdefs[2*mapindex]));
  142.     y_str += spacing; 
  143.     XDrawImageString(dpy,info,gc,x_str,y_str,Mapdefs[2*mapindex+1],
  144.         strlen(Mapdefs[2*mapindex+1]));
  145.     x_str = 0;
  146.     y_str += 2*spacing; 
  147. #ifdef NorthSouth
  148.     if (mapindex == 7) {
  149.         sprintf(str,"          South      North");
  150.         XDrawImageString(dpy,info,gc,x_str,y_str, str, strlen(str));
  151.         y_str += spacing; 
  152.         for (i=0;i<HALF;i++) {
  153.             sprintf(str," %s  %8.4f  %8.4f", mops[i],params[i],params[HALF+i]);
  154.             XDrawImageString(dpy,info,gc,x_str,y_str, str, strlen(str));
  155.             y_str += spacing; 
  156.         }
  157.     }
  158.     else
  159. #endif /* NorthSouth */
  160.     if (mapindex == 24) {
  161.         sprintf(str,"       X             Y");
  162.         XDrawImageString(dpy,info,gc,x_str,y_str, str, strlen(str));
  163.         y_str += spacing; 
  164.         for (i=0;i<numparams[mapindex];i++) {
  165.             sprintf(str," %c = %8.4f  %c = %8.4f", 
  166.                 ops[i], params[i], tolower(ops[i]), params[HALF+i]);
  167.             XDrawImageString(dpy,info,gc,x_str,y_str, str, strlen(str));
  168.             y_str += spacing; 
  169.         }
  170.     }
  171.     else
  172.         for (i=0;i<numparams[mapindex];i++) {
  173.             sprintf(str,"   %c=%lf",ops[i],params[i]);
  174.             XDrawImageString(dpy,info,gc,x_str,y_str, str, strlen(str));
  175.             y_str += spacing;
  176.         }
  177.     x_str = 50 + (23*overall.width);
  178.     y_str = 5*spacing; 
  179.     sprintf(str,"width = %d, height = %d, run = %d", width,height,run);
  180.     if ((criwidth != width) || (criheight != height))
  181.         sprintf(str,"%s, cwidth=%d, cheight=%d",str,criwidth,criheight);
  182.     XDrawImageString(dpy,info,gc,x_str,y_str,str,strlen(str));
  183.     y_str += spacing;
  184.     sprintf(str,"settle = %d, dwell = %d, maxcrit = %d",settle,dwell,maxcrit);
  185.     XDrawImageString(dpy,info,gc,x_str,y_str,str,strlen(str));
  186.     y_str += spacing;
  187.     sprintf(str,"delta = %6.5f, cdelta = %6.5f, radius = %d",
  188.                 delta, cdelt, maxradius);
  189.     XDrawImageString(dpy,info,gc,x_str,y_str,str,strlen(str));
  190.     y_str += spacing;
  191.     if (lyap) {
  192.         if (p1 < HALF) {
  193. #ifdef NorthSouth
  194.         if (mapindex == 7)
  195.             sprintf(str,"x-axis = (%lf,%lf), parameter = South %s, range = %lf",
  196.                 min_x, max_x, mops[p1], x_range);
  197.         else
  198. #endif
  199.             sprintf(str,"x-axis = (%lf,%lf), parameter = %c, range = %lf",
  200.             min_x, max_x, ops[p1], x_range);
  201.         }
  202.         else {
  203. #ifdef NorthSouth
  204.         if (mapindex == 7)
  205.             sprintf(str,"x-axis = (%lf,%lf), parameter = North %s, range = %lf",
  206.             min_x, max_x, mops[p1-HALF], x_range);
  207.         else
  208. #endif
  209.             sprintf(str,"x-axis = (%lf,%lf), parameter = %c, range = %lf",
  210.             min_x, max_x, tolower(ops[p1-HALF]), x_range);
  211.         }
  212.     }
  213.     else
  214.         sprintf(str,"x-axis = (%lf,%lf), x-range = %lf",min_x,max_x,x_range);
  215.     XDrawImageString(dpy,info,gc,x_str,y_str,str,strlen(str));
  216.     y_str += spacing;
  217.     if (lyap) {
  218.         if (p2 < HALF) {
  219. #ifdef NorthSouth
  220.         if (mapindex == 7)
  221.             sprintf(str,"y-axis = (%lf,%lf), parameter = South %s, range = %lf",
  222.             min_y, max_y, mops[p2], y_range);
  223.         else
  224. #endif
  225.             sprintf(str,"y-axis = (%lf,%lf), parameter = %c, range = %lf",
  226.             min_y, max_y,ops[p2], y_range);
  227.         }
  228.         else {
  229. #ifdef NorthSouth
  230.         if (mapindex == 7)
  231.             sprintf(str,"y-axis = (%lf,%lf), parameter = North %s, range = %lf",
  232.             min_y, max_y, mops[p2-HALF], y_range);
  233.         else
  234. #endif
  235.             sprintf(str,"y-axis = (%lf,%lf), parameter = %c, range = %lf",
  236.             min_y, max_y, tolower(ops[p2-HALF]), y_range);
  237.         }
  238.     }
  239.     else
  240.         sprintf(str,"y-axis = (%lf,%lf), y-range = %lf",min_y,max_y,y_range);
  241.     XDrawImageString(dpy,info,gc,x_str,y_str,str,strlen(str));
  242.     y_str += spacing;
  243.     if ((c_min_x != min_x) || (c_min_y != min_y) ||
  244.         (c_x_range != x_range) || (c_y_range != y_range)) {
  245.         sprintf(str,"critical axes = (%lf, %lf) x (%lf, %lf)",
  246.         c_min_x, c_min_x + c_x_range, c_min_y, c_min_y + c_y_range);
  247.         XDrawImageString(dpy,info,gc,x_str,y_str,str,strlen(str));
  248.         y_str += spacing;
  249.     }
  250.     if ((t_min_x != min_x) || (t_min_y != min_y) ||
  251.         (t_x_range != x_range) || (t_y_range != y_range)) {
  252.         sprintf(str,"orbit axes = (%lf, %lf) x (%lf, %lf)",
  253.         t_min_x, t_min_x + t_x_range, t_min_y, t_min_y + t_y_range);
  254.         XDrawImageString(dpy,info,gc,x_str,y_str,str,strlen(str));
  255.         y_str += spacing;
  256.     }
  257.     sprintf(str,
  258.        "numcolors=%d STARTCOLOR=%d MINCOLINDEX=%d histogram=%d sea=%lf sky=%lf",
  259.                 numcolors,STARTCOLOR,MINCOLINDEX,histogram,sea_level,sky_level);
  260.     XDrawImageString(dpy,info,gc,x_str,y_str,str,strlen(str));
  261. #ifdef NorthSouth
  262.     if (mapindex == 7) {
  263.         y_str += spacing;
  264.         sprintf(str, "North: A0 =%8.6f A1 =%8.6f A2 =%8.6f A* =%8.6f", 
  265.                     A_zero, A_one, A_two, A_star);
  266.         XDrawImageString(dpy,info,gc,x_str,y_str,str,strlen(str));
  267.         y_str += spacing;
  268.         sprintf(str,
  269.             "       H0 =%8.6f H1 =%8.6f B0 =%8.6f (%8.6f) B1 =%8.6f (%8.6f)", 
  270.                 H_zero, H_one, B_zero, O_B_zero, B_one, O_B_one);
  271.         XDrawImageString(dpy,info,gc,x_str,y_str,str,strlen(str));
  272.         y_str += spacing;
  273.         sprintf(str,
  274.                    "South: A0 =%8.6f A1 =%8.6f A2 =%8.6f A* =%12.10lf", 
  275.                         S_A_zero, S_A_one, S_A_two, S_A_star);
  276.         XDrawImageString(dpy,info,gc,x_str,y_str,str,strlen(str));
  277.         y_str += spacing;
  278.         sprintf(str,
  279.                    "       B0 =%8.6f (%8.6f) B1 =%8.6f (%8.6f)", 
  280.                         S_B_zero, O_S_B_zero, S_B_one, O_S_B_one);
  281.         XDrawImageString(dpy,info,gc,x_str,y_str,str,strlen(str));
  282.         y_str += spacing;
  283.         sprintf(str,"Singularities in the North and South at %lf and %lf", 
  284.         singularity, S_singularity);
  285.         XDrawImageString(dpy,info,gc,x_str,y_str,str,strlen(str));
  286.     }
  287.     else if (mapindex == 8) {
  288.         y_str += spacing;
  289.         sprintf(str, 
  290.         "Currently: pB = %8.6f ET = %8.6f FT = %8.6f CT = %8.6f GT = %8.6f",
  291.             pB, ET, FT, CT, GT);
  292.         XDrawImageString(dpy,info,gc,x_str,y_str,str,strlen(str));
  293.         y_str += spacing;
  294.         sprintf(str, "North rK = %8.4f  South rK = %8.4f", RK.x, RK.y);
  295.         XDrawImageString(dpy,info,gc,x_str,y_str,str,strlen(str));
  296.         y_str += spacing;
  297.         sprintf(str,"Singularities in the North and South at %lf and %lf",
  298.             singularity, S_singularity);
  299.         XDrawImageString(dpy,info,gc,x_str,y_str,str,strlen(str));
  300.     }
  301.     else if (mapindex == 9) {
  302.         y_str += spacing;
  303.         sprintf(str, 
  304.         "Currently: pB = %8.6f ET = %8.6f FT = %8.6f CT = %8.6f GT = %8.6f",
  305.             pB, ET, FT, CT, GT);
  306.         XDrawImageString(dpy,info,gc,x_str,y_str,str,strlen(str));
  307.         y_str += spacing;
  308.         sprintf(str, "North GNP = %8.4f  South GNP = %8.4f", GNP.x, GNP.y);
  309.         XDrawImageString(dpy,info,gc,x_str,y_str,str,strlen(str));
  310.         y_str += spacing;
  311.         sprintf(str,"Singularities in the North and South at %lf and %lf",
  312.             singularity, S_singularity);
  313.         XDrawImageString(dpy,info,gc,x_str,y_str,str,strlen(str));
  314.     }
  315. #endif
  316.     y_str += spacing;
  317.     sprintf(str,"find = %d, portrait = %d, attractors = %d, critical = %d",
  318.         find,portrait,attractors,critical);
  319.     XDrawImageString(dpy,info,gc,x_str,y_str,str,strlen(str));
  320.     y_str += spacing;
  321.     if (lyap)
  322.         sprintf(str,"lyap = %d, mandel = %d, initial (x,y) = (%lf,%lf)",
  323.             lyap,mandel,start_x,start_y);
  324.     else
  325.         if (histogram)
  326.             sprintf(str,
  327.                 "mandel=%d intersections=%d numattrs=%d minhist=%d maxhist=%d", 
  328.                 mandel, found_arc, numattrs, minhist, maxhist);
  329.         else
  330.             sprintf(str,"mandel = %d, intersections = %d, numattrs = %d", 
  331.                             mandel, found_arc, numattrs);
  332.     XDrawImageString(dpy,info,gc,x_str,y_str,str,strlen(str));
  333. }
  334.  
  335. MapSelect()
  336. {
  337.     int n;
  338.     XEvent event;
  339.  
  340.     n = XEventsQueued(dpy, QueuedAfterFlush);
  341.     while (n--) {
  342.             XNextEvent(dpy, &event);
  343.             switch(event.type) 
  344.             {
  345.             case KeyPress:
  346.         if (KeySelect(&event))
  347.             return(1);
  348.         break;
  349.             case Expose:
  350.         Show_Maps(numselect);
  351.             break;
  352.             case ButtonPress:
  353.         if (ButtonSelect(&event))
  354.             return(1);
  355.             break;
  356.             }
  357.     }
  358.     return(0);
  359. }
  360.  
  361. KeySelect(event)
  362. XKeyEvent *event;
  363. {
  364.     unsigned char key;
  365.     static int selected;
  366.     extern int numeric;
  367.  
  368.     selected = 0;
  369.         if (XLookupString(event, (char *)&key, sizeof(key), (KeySym *)0,
  370.                 (XComposeStatus *)0) > 0)
  371.                 switch (key) {
  372.         case '+': dwell++; break;
  373.         case '-': dwell--; if (dwell < 0) dwell = 0; break;
  374.         case '}': settle++; break;
  375.         case '{': settle--; if (settle < 0) settle = 0; break;
  376.         case '>': dwell *= 2; if (dwell == 0) dwell = 1; break;
  377.         case '<': dwell /= 2; break;
  378.         case ']': settle *= 2; if (settle == 0) settle = 1; break;
  379.         case '[': settle /= 2; break;
  380.         case 'a':
  381.         case 'A': portrait = (!portrait); break;
  382.         case 'b':
  383.         case 'B': critical = (!critical); break;
  384.         case 'c':
  385.         case 'C': precrit = (!precrit); break;
  386.         case 'd':
  387.         case 'D': histogram = (!histogram); break;
  388.         case 'e':
  389.         case 'f':
  390.         case 'E':
  391.         case 'F': if (++lyap > 2) 
  392.                 lyap = 0;
  393.               break;
  394.         case '8': numselect++;
  395.               if (numselect >= NUMMAPS)
  396.                 numselect = 0;
  397.               Show_Maps(numselect);
  398.               break;
  399.         case '7': numselect--;
  400.               if (numselect < 0)
  401.                 numselect = NUMMAPS-1;
  402.               break;
  403.         case '\n':
  404.         case ' ': selected = 1;
  405.               break;
  406.         case 'q':
  407.         case 'Q': Cleanup(); exit(0);
  408.               break;
  409.         }
  410.     Show_Maps(numselect);
  411.     if (selected) {
  412.         mapindex = numselect;
  413.         map = Maps[mapindex];
  414.         if (numeric)
  415.             deriv = dnumeric;
  416.         else
  417.             deriv = Derivs[mapindex];
  418.         reset_params();
  419.         return(1);
  420.     }
  421.     return(0);
  422. }
  423.  
  424. ButtonSelect(event)
  425. XButtonEvent *event;
  426. {
  427.     static int selected;
  428.     extern int numeric;
  429.  
  430.     selected = 0;
  431.     switch (event->button) {
  432.         case Button1:        /* highlight the selection */
  433.             if (event->x < map_width)
  434.                 numselect = Min(NUMMAPS-1, (event->y * NUMMAPS) / S_HEIGHT);
  435.             else if (event->x < num_width) {
  436.                 if (event->y < (S_HEIGHT/ 2))
  437.                     settle /= 2;
  438.                 else
  439.                     dwell /= 2;
  440.             }
  441.             else {
  442.                 if (event->y < (S_HEIGHT / 6))
  443.                     portrait = (!portrait);
  444.                 else if (event->y < (S_HEIGHT / 3))
  445.                     critical = (!critical);
  446.                 else if (event->y < (S_HEIGHT / 2))
  447.                     precrit = (!precrit);
  448.                 else if (event->y < (2*S_HEIGHT/3)) {
  449.                     histogram = (!histogram);
  450.                     if (histogram)
  451.                         HistoMem();
  452.                     else
  453.                         FreeHist();
  454.                 }
  455.                 else
  456.                     if (++lyap > 2)
  457.                         lyap = 0;
  458.             }
  459.             Show_Maps(numselect);
  460.             break;
  461.         case Button2:        /* Used to increase dwell or settle */
  462.             if (event->x < map_width)
  463.                 numselect = Min(NUMMAPS-1, (event->y * NUMMAPS) / S_HEIGHT);
  464.             else if (event->x < num_width) {
  465.                 if (event->y < (S_HEIGHT / 2)) {
  466.                     settle *= 2; if (settle == 0) settle = 1;
  467.                 }
  468.                 else {
  469.                     dwell *= 2; if (dwell == 0) dwell = 1;
  470.                 }
  471.             }
  472.             else {
  473.                 if (event->y < (S_HEIGHT / 4))
  474.                     portrait = (!portrait);
  475.                 else if (event->y < (S_HEIGHT / 2))
  476.                     critical = (!critical);
  477.                 else if (event->y < (S_HEIGHT / 2))
  478.                     precrit = (!precrit);
  479.                 else if (event->y < (2*S_HEIGHT/3)) {
  480.                     histogram = (!histogram);
  481.                     if (histogram)
  482.                         HistoMem();
  483.                     else
  484.                         FreeHist();
  485.                 }
  486.                 else
  487.                     if (++lyap > 2)
  488.                         lyap = 0;
  489.             }
  490.             Show_Maps(numselect);
  491.             break;
  492.         case Button3:        /* pick the highlighted selection */
  493.             mapindex = numselect; selected = 1;
  494.             break;
  495.     }
  496.     if (selected) {
  497.         map = Maps[mapindex];
  498.         if (numeric)
  499.             deriv = dnumeric;
  500.         else
  501.             deriv = Derivs[mapindex];
  502.         reset_params();
  503.         freemem(); setupmem();
  504.         return(1);
  505.     }
  506.     return(0);
  507. }
  508.  
  509. Show_Maps(mapnum)
  510. int mapnum;
  511. {
  512.     static int i, x_str, y_str;
  513.     static GC gc;
  514.  
  515.     XFillRectangle(dpy,trajec,Data_GC[0],0,0,
  516.     XDisplayWidth(dpy, screen), XDisplayHeight(dpy, screen));
  517.     if (displayplanes > 1)
  518.         XQueryTextExtents(dpy,(XID)XGContextFromGC(Data_GC[CG]),"X",
  519.             1,&dir,&ascent,&descent,&overall);
  520.     else
  521.         XQueryTextExtents(dpy,(XID)XGContextFromGC(Data_GC[1]),"X",
  522.             1,&dir,&ascent,&descent,&overall);
  523.     spacing = ascent + descent + 1;
  524.     map_width = XDisplayWidth(dpy, screen) * 0.5;
  525.     num_width = XDisplayWidth(dpy, screen) * 0.75;
  526.     x_str = 20; numselect = mapnum;
  527.     for (i=0; i< NUMMAPS; i++) {
  528.         if (i == mapnum)
  529.             gc = Reverse_GC;
  530.         else
  531.             if (displayplanes > 1)
  532.                 gc = Data_GC[CG];
  533.             else
  534.                 gc = Data_GC[1];
  535.         y_str = (int)(((double)S_HEIGHT/(double)NUMMAPS)*((double)i+0.5));
  536.         sprintf(str," %3d. %s ",i, Mapnames[i]);
  537.         XDrawImageString(dpy,trajec,gc,x_str,y_str,str,strlen(str));
  538.         if (displayplanes > 1)
  539.             gc = Data_GC[CG];
  540.         else
  541.             gc = Data_GC[1];
  542.         XDrawLine(dpy, trajec, gc, 0, i*S_HEIGHT/NUMMAPS, map_width, 
  543.             i*S_HEIGHT/NUMMAPS);
  544.     }
  545.     XDrawLine(dpy, trajec, gc, 0, S_HEIGHT, map_width, S_HEIGHT);
  546.     XDrawLine(dpy, trajec, gc, map_width, 0, map_width, S_HEIGHT);
  547.     XDrawLine(dpy, trajec, gc, num_width-1, 0, num_width-1, S_HEIGHT);
  548.     XDrawLine(dpy, trajec, gc, map_width, S_HEIGHT/2, num_width,S_HEIGHT/2);
  549.     XDrawLine(dpy, trajec, gc, num_width, 0, S_WIDTH, 0);
  550.     XDrawLine(dpy, trajec, gc, num_width, S_HEIGHT/6, S_WIDTH, S_HEIGHT/6);
  551.     XDrawLine(dpy, trajec, gc, num_width, S_HEIGHT/3, S_WIDTH, S_HEIGHT/3);
  552.     XDrawLine(dpy, trajec, gc, num_width, S_HEIGHT/2, S_WIDTH, S_HEIGHT/2);
  553.     XDrawLine(dpy, trajec, gc, num_width, 2*S_HEIGHT/3, S_WIDTH, 2*S_HEIGHT/3);
  554.     XDrawLine(dpy, trajec, gc, num_width, 5*S_HEIGHT/6, S_WIDTH, 5*S_HEIGHT/6);
  555.     XDrawLine(dpy, trajec, gc, num_width, S_HEIGHT, S_WIDTH, S_HEIGHT);
  556.     sprintf(str," settle = %d ", settle);
  557.     gc = Reverse_GC;
  558.     x_str=map_width+(((num_width-map_width)-(strlen(str)*overall.width))/2);
  559.     y_str = (S_HEIGHT / 4);
  560.     XDrawImageString(dpy,trajec,gc,x_str,y_str,str,strlen(str));
  561.     sprintf(str," dwell = %d ", dwell);
  562.     x_str=map_width+(((num_width-map_width)-(strlen(str)*overall.width))/2);
  563.     y_str = (3 * S_HEIGHT / 4);
  564.     XDrawImageString(dpy,trajec,gc,x_str,y_str,str,strlen(str));
  565.     x_str = num_width; y_str = S_HEIGHT / 12;
  566.     if (lyap)
  567.         sprintf(str," A. Bifurcation Diagram ");
  568.     else
  569.         sprintf(str," A. Phase Portrait      ");
  570.     if (portrait)
  571.         gc = Reverse_GC;
  572.     else
  573.            if (displayplanes > 1)
  574.                gc = Data_GC[CG];
  575.            else
  576.                gc = Data_GC[1];
  577.     XDrawImageString(dpy,trajec,gc,x_str,y_str,str,strlen(str));
  578.     y_str = S_HEIGHT / 4;
  579.     sprintf(str," B. Critical Curves ");
  580.     if (critical)
  581.         gc = Reverse_GC;
  582.     else
  583.            if (displayplanes > 1)
  584.                gc = Data_GC[CG];
  585.           else
  586.                gc = Data_GC[1];
  587.     XDrawImageString(dpy,trajec,gc,x_str,y_str,str,strlen(str));
  588.     y_str = 5 * S_HEIGHT / 12;
  589.     sprintf(str," C. Pre-critical Curves ");
  590.     if (precrit)
  591.         gc = Reverse_GC;
  592.     else
  593.            if (displayplanes > 1)
  594.                gc = Data_GC[CG];
  595.            else
  596.                gc = Data_GC[1];
  597.     XDrawImageString(dpy,trajec,gc,x_str,y_str,str,strlen(str));
  598.     y_str = 7 * S_HEIGHT / 12;
  599.     sprintf(str," D. Histographic Data ");
  600.     if (histogram)
  601.         gc = Reverse_GC;
  602.     else
  603.            if (displayplanes > 1)
  604.                gc = Data_GC[CG];
  605.           else
  606.                gc = Data_GC[1];
  607.     XDrawImageString(dpy,trajec,gc,x_str,y_str,str,strlen(str));
  608.     y_str = 3 * S_HEIGHT / 4;
  609.     sprintf(str," E. Basins of Attraction ");
  610.     if (!lyap)
  611.         gc = Reverse_GC;
  612.     else
  613.            if (displayplanes > 1)
  614.                gc = Data_GC[CG];
  615.          else
  616.                gc = Data_GC[1];
  617.     XDrawImageString(dpy,trajec,gc,x_str,y_str,str,strlen(str));
  618.     y_str = 11 * S_HEIGHT / 12;
  619.     sprintf(str," F. Lyapunov Exponents ");
  620.     if (lyap >= 2)
  621.         gc = Reverse_GC;
  622.     else
  623.            if (displayplanes > 1)
  624.                gc = Data_GC[CG];
  625.            else
  626.                gc = Data_GC[1];
  627.     XDrawImageString(dpy,trajec,gc,x_str,y_str,str,strlen(str));
  628. }
  629.  
  630. Show_Tits()
  631. {
  632.     static int i, x_str, y_str;
  633.     static GC gc;
  634.     char x_fontname[128];
  635.     XFontStruct *x_fontinfo = (XFontStruct *)0;
  636.  
  637.     XClearWindow(dpy, trajec);
  638.     if (displayplanes > 1)
  639.         gc = Data_GC[CG];
  640.     else
  641.         gc = Data_GC[1];
  642.         if (x_fontinfo != (XFontStruct *)0)
  643.                 XUnloadFont(dpy, x_fontinfo->fid);
  644.     if (XDisplayWidth(dpy, screen) <= 800)
  645.         strcpy(x_fontname, "10x20");
  646.     else
  647.         strcpy(x_fontname, "12x24");
  648.     if ((x_fontinfo=XLoadQueryFont(dpy,x_fontname))!=(XFontStruct *)0){
  649.         XSetFont(dpy, gc, x_fontinfo->fid);
  650.         XSetFont(dpy, Reverse_GC, x_fontinfo->fid);
  651.     }
  652.     XQueryTextExtents(dpy,(XID)XGContextFromGC(gc),"X",
  653.             1,&dir,&ascent,&descent,&overall);
  654.     sprintf(str,"E N D O");
  655.     x_str=(XDisplayWidth(dpy,screen) - (strlen(str)*overall.width))/2;
  656.     y_str = 80;
  657.     XDrawImageString(dpy,trajec,gc,x_str,y_str,str,strlen(str));
  658.     if (x_fontinfo != (XFontStruct *)0)
  659.         XUnloadFont(dpy, x_fontinfo->fid);
  660.     if (XDisplayWidth(dpy, screen) <= 800)
  661.         strcpy(x_fontname, "6x10");
  662.     else
  663.         strcpy(x_fontname, "9x15");
  664.     if ((x_fontinfo = XLoadQueryFont(dpy,x_fontname)) != (XFontStruct *)0) {
  665.         XSetFont(dpy, gc, x_fontinfo->fid);
  666.         XSetFont(dpy, Reverse_GC, x_fontinfo->fid);
  667.     }
  668.     XQueryTextExtents(dpy,(XID)XGContextFromGC(gc),"X",
  669.             1,&dir,&ascent,&descent,&overall);
  670.     spacing = ascent + descent;
  671.     y_str += 3 * spacing;
  672.     sprintf(str,"Iterated Endomorphisms of the Plane");
  673.     x_str=(XDisplayWidth(dpy,screen) - (strlen(str)*overall.width))/2;
  674.     XDrawImageString(dpy,trajec,gc,x_str,y_str, str, strlen(str));
  675.     y_str = S_HEIGHT - (5*spacing);
  676.     sprintf(str,"by");
  677.     x_str=(XDisplayWidth(dpy,screen) - (strlen(str)*overall.width))/2;
  678.     XDrawImageString(dpy,trajec,gc,x_str,y_str, str, strlen(str));
  679.     y_str += 1.25*spacing;
  680.     sprintf(str,"Ronald Joe Record and Ralph H. Abraham");
  681.     x_str=(XDisplayWidth(dpy,screen) - (strlen(str)*overall.width))/2;
  682.     XDrawImageString(dpy,trajec,gc,x_str,y_str, str, strlen(str));
  683.     y_str += 1.25 * spacing;
  684.     sprintf(str,"Copyright (c) 1992, 1993   All Rights Reserved");
  685.     x_str=(XDisplayWidth(dpy,screen) - (strlen(str)*overall.width))/2;
  686.     XDrawImageString(dpy,trajec,gc,x_str,y_str, str, strlen(str));
  687.     y_str += 1.25 * spacing;
  688.     sprintf(str, "Press space bar or any mouse button to begin");
  689.     x_str=(XDisplayWidth(dpy,screen) - (strlen(str)*overall.width))/2;
  690.     XDrawImageString(dpy,trajec,gc,x_str,y_str, str, strlen(str));
  691.     y_str += 1.25 * spacing;
  692.     sprintf(str, 
  693.    "Press 'n' for next, 'p' for previous, 'w' for new colormap, 'q' to quit");
  694.     x_str=(XDisplayWidth(dpy,screen) - (strlen(str)*overall.width))/2;
  695.     XDrawImageString(dpy,trajec,gc,x_str,y_str, str, strlen(str));
  696. }
  697.  
  698. Tit_Event()
  699. {
  700.     static int showem; 
  701.     static int numdemo=0;
  702.     static XEvent event;
  703.     unsigned char key;
  704.     extern int Qflag, numattrs;
  705.     extern void DemoSpin();
  706.  
  707.     if (run) {
  708.         compendo();
  709.         increment(Qflag);
  710.     }
  711.     else {
  712.         if (!clearflag)
  713.             DemoSpin(dpy, cmap, Colors, STARTCOLOR, numcolors, delay, 4);
  714.         Change_Parms((++numdemo) % MAXDEMOS);
  715.         Clear(trajec);
  716.         numwheels = MAXWHEELS;
  717.         init_color(dpy, trajec, cmap, Colors, STARTCOLOR, MINCOLINDEX,
  718.                     numcolors, numwheels, "endo", "Endo", numattrs);
  719.     }
  720.     showem = 0;
  721.     while (XCheckMaskEvent(dpy, KeyPressMask|ButtonPressMask|ExposureMask,
  722.                &event)) {
  723.         key = 'a';
  724.         switch(event.type) {
  725.             case KeyPress:
  726.                 XLookupString((XKeyEvent *)&event, (char *)&key, sizeof(key), 
  727.                     (KeySym *)0, (XComposeStatus *)0);
  728.                 if ((key == 'q') || (key == 'Q')) {
  729.                     Cleanup();
  730.                     exit(0);
  731.                 }
  732.                 else if (key == 'n') {
  733.                     numdemo = ++numdemo % MAXDEMOS;
  734.                     Change_Parms(numdemo);
  735.                     Clear(trajec);
  736.                 }
  737.                 else if (key == 'p') {
  738.                     numdemo--;
  739.                     if (numdemo < 0)
  740.                         numdemo = MAXDEMOS - 1;
  741.                     Change_Parms(numdemo);
  742.                     Clear(trajec);
  743.                 }
  744.                 else if (key == 'w') {
  745.                     if (numwheels < MAXWHEELS)
  746.                         numwheels++;
  747.                        else
  748.                         numwheels = 0;
  749.                     init_color(dpy,trajec,cmap,Colors,STARTCOLOR,
  750.                         MINCOLINDEX,numcolors,numwheels,"endo","Endo",numattrs);
  751.                 }
  752.                 else
  753.                     return(1);
  754.                 break;
  755.             case ButtonPress: 
  756.                 return(1);
  757.             case Expose:
  758.                 if (event.xexpose.window == trajec)
  759.                     showem = 1;
  760.             break;
  761.     }
  762.         }
  763.     if (showem)
  764.         Show_Tits();
  765.     return(0);
  766. }
  767.